package com.gjy.sentinel.demo.example;

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;

/**
 * @author gjy
 * @version 1.0
 * @since 2025-10-15 16:42:12
 */
public class SentinelDemo {

    public static void main(String[] args) {
        // ------------------- 方式 1：注解 + 动态代理（推荐） -------------------
        // 这里手动创建 JDK 动态代理，Sentinel 会自动把入口包装成 SphU.entry
        IOrderService orderService = new OrderServiceImpl();

        // 正常调用（流控未触发）
        System.out.println("[注解方式] result = " + orderService.createOrder("u001", "SKU001", 1));

        // ------------------- 方式 2：手动 SphU.entry -------------------
        System.out.println("[手动方式] result = " + createOrderManual("u002", "SKU002", 2));
    }

    /**
     * 手动入口：资源名使用统一的枚举（或任意字符串）
     */
    public static String createOrderManual(String userId, String sku, int amount) {
        Entry entry = null;
        try {
            // 资源名即接口全限定名 # 方法名，保持与注解里一致
            entry = SphU.entry("com.gjy.sentinel.demo.example.IOrderService#createOrder");
            // 业务调用（这里直接 new Impl，实际项目里可能是注入的 Bean）
            return new OrderServiceImpl().createOrder(userId, sku, amount);
        } catch (BlockException be) {
            // 被限流/降级拦截
            return "order-blocked-manual";
        } finally {
            if (entry != null) {
                entry.exit();
            }
        }
    }

}
